Skip to content

Feature/v0.15.1#15

Closed
shadowlink0122 wants to merge 40 commits intomainfrom
feature/v0.15.0
Closed

Feature/v0.15.1#15
shadowlink0122 wants to merge 40 commits intomainfrom
feature/v0.15.0

Conversation

@shadowlink0122
Copy link
Owner

概要

変更点

関連Issue

テスト

  • 単体テスト追加/更新
  • 既存テスト通過
  • E2Eテスト確認(該当する場合)

チェックリスト

  • docker compose run --rm lint 通過
  • ドキュメント更新(必要な場合)
  • docs/design/ との整合性確認

- Phase 1: module/port/always_ff/always_comb/if-else コード生成
- Phase 2: case文 (SwitchInt多分岐→case/endcase)、parameter宣言
- Phase 3: BRAM/LutRAM推論 (#[sv::bram]/[sv::lutram])
- Phase 4: マルチクロックドメイン (#[sv::clock_domain])
- Phase 5: パイプライン/リソース共有ヒント
- テストベンチ自動生成 (*_tb.sv)
- XDC制約ファイル出力 (#[sv::pin])
- inoutポートサポート
- 非合成型チェック (Pointer/String/Float)
- テストランナー統合 (make test-sv / tsv0-tsv3)
- Verilator lintによる生成SV検証
- テストケース7件 (basic3/control2/memory1/advanced1) 全PASS
- テストランナーにStage 3シミュレーション実行を追加
- iverilog + vvp で自動生成テストベンチを実際にシミュレーション実行
- 全7テストでシミュレーション成功確認 (VCD波形生成)
- .expectファイルでSIM_OK/COMPILE_OKの両方に対応
- SVターゲットではMIR最適化(DCE/CopyProp/ConstFold)をスキップ
  (合成ツールが最適化を行うため、一時変数代入の除去を防止)
- テストファイルの関数宣言を func→void に修正
- SVテストからmain()を削除(ハードウェアにmainは不要)
- 不要なデバッグ出力を削除
- .gitignoreにVCDファイルを追加
- alwaysブロック直前に関数名コメントを出力 (// add, // tick等)
- MIR一時変数(_tXXXX)を再帰的にインライン展開
  - adder: result = a + b; (4行→1行に簡潔化)
  - counter: count <= count + 32'd1; (ノンブロッキング代入も対応)
  - mux: if (sel) (if条件内の一時変数も展開)
- ブロッキング代入(=)とノンブロッキング代入(<=)の両方に対応
- デバッグ出力の残骸を削除
- テストベンチに//! test:コメント駆動のテストシナリオ自動生成
  - 例: //! test: a=3, b=5 -> result=8
  - combinational: #10待ち、sequential: repeat(N) @(posedge clk)
- テストランナーでTEST行の期待値比較検証
- モジュール名をソースファイル名から生成(SV予約語output回避)
- SV予約語チェック追加(output,input等をモジュール名に使用不可)
- 値検証テスト: adder(3件), mux(2件), priority_encoder(3件)
- sequential回路(counter,shift_register,bram,multi_clock)はCOMPILE_OK
網羅テスト追加 (8テスト新規):
- basic/arithmetic: 算術演算 (+,-,*,/,%)
- basic/bitwise: ビット演算 (&,|,^,~)
- basic/shift: シフト演算 (<<,>>)
- basic/unary: 単項演算 (-,~)
- basic/multi_expr: 複合式・複数出力
- control/compare: 比較演算 (==,!=,<,>,<=,>=)
- control/nested_if: ネストif-else
- control/signed_ops: 符号付き演算

バグ修正:
- BitNot(~)のMIR lowering欠落: HirUnaryOp::BitNot→MirUnaryOp::BitNotのcase文追加
- if条件内の一時変数が多段展開されない: 反復展開ループに修正
- signed定数を32'sd形式で出力(signed/unsigned比較ミスマッチ防止)

全15テスト PASS (make test-sv-o0)
- TypeKindにPosedge/Negedge/Wire/Reg型を追加
- レキサー/パーサーにSVキーワードの解析を追加
- posedge型パラメータ → always_ff @(posedge X) ブロック生成
- negedge型パラメータ → always_ff @(negedge X) ブロック生成
- テストベンチ生成: リセット信号名を動的に検出(rst/rst_n対応)
- rst_nの場合はアクティブLowリセットシーケンスを生成
- posedge_counter.cm / negedge_reset.cm テストを追加
- 全17件SVテストPASS確認
- 100MHz想定、50Mカウントで約1Hz点滅
- posedge型クロック入力 + リセット付きカウンタ + LEDトグル
- SVテスト全18件PASS
- 0bリテラルによるビットマスク操作のSV変換を検証
- 0b01010101 → 32'd85、0b10101010 → 32'd170 として正しく変換
- SVテスト全19件PASS
- レキサーで数値直後のN'[dbhDBH]VALUEパターンを認識
- Token→AST→HIR→MIR→SVコード生成の全段でbit_width情報を伝搬
- emitConstantでユーザー指定幅を使用 (例: 8'hFF → 8'd255)
- テスト: sv_width_literal.cm, binary_bits.cm 追加
- SVテスト全20件PASS
- bit_base/bit_originalフィールドをToken→AST→HIR→MIRの全段に追加
- SVコード生成で元の表記をそのまま使用:
  3'b101 → 3'b101 (以前: 3'd5)
  8'hFF  → 8'hFF  (以前: 8'd255)
  8'd170 → 8'd170 (変化なし)
- SVテスト全20件PASS
- SV幅付きリテラルテストを全ベース形式(d/b/h)で網羅
  8'd170, 4'b1010, 8'hAB, 3'b101, 16'hDEAD 等9パターン
- VSCode拡張: 文字リテラルパターンをmatchベースに変更
  'X' (1文字)のみを文字リテラルとして認識
  8'hFF等がcharとして認識される問題を修正
- VSCode拡張: SV幅付きリテラルのハイライトパターン追加
  constant.numeric.sv-literal.cm スコープ
- SVテスト全20件PASS
- run_parallel_testにSVバックエンドのcaseを追加
- verilator lint→iverilog→vvpシミュレーションのフルパイプライン
- ファイル名にBASHPID/RANDOMを付与して並列安全性を確保
- make tsvp で全20件PASS確認
- analyzeFunctionでインデントレベルを1(module内)で開始
- Pass 2のインライン展開で元の行インデントを保持
- if/else内の代入文が正しいインデントで出力されるように
- always_comb/always_ffブロックがmodule内に正しく配置
- SVテスト全20件PASS
- analyzeFunctionでalwaysブロック構築後に使用状況を解析
- alwaysブロック内で参照されない_tXXXX変数をreg_declarationsから除去
- nested_if: logic宣言9個→0個に削減
- led_blinker: counterのみ残留(実際に使用)
- SVテスト全20件PASS
- CIにSVテスト(sv-o3)をintegration-testに追加
- SVバックエンドチュートリアル(ja/en)を追加
  ポート宣言、組み合わせ/順序回路、SV幅付きリテラル等を網羅
- v0.15.0リリースノートを作成
  SVバックエンド、VSCode拡張、テスト基盤の全変更をまとめ
- releases/index.mdにv0.15.0を追記
- VERSION, src/main.cpp, vscode-extension/package.json を0.15.0に更新
- SVバックエンド全機能の変更概要
- VSCode拡張の変更内容
- テスト基盤・CI・ドキュメント変更をまとめ
- NOT ~0: 0→-1 (全ビット反転の正しい結果)
- flags after clear 0: 5→4 (ビット0クリア後の正しい結果)
- tests/programs/配下のexpectファイルも同様に修正
- NOT ~0: 0→-1, flags after clear 0: 5→4
- 全400テストPASS確認
1. rst自動追加: clkの実位置を検索して直後に挿入
2. validateSynthesizableTypes: compile()から呼出し、エラー時はruntime_errorで停止
3. emitBlock: verboseガードを除去し常時ブロック生成
4. signed_ops.expect: シミュレーション結果に合わせて修正
5. bram.cm: コメントを実態に合わせて修正(BRAM配列推論は将来対応)
6. test_runner Stage3: expectにSIM_OK/TEST行がある場合のみシミュレーション実行
7. expect_ident: posedge/negedge/wire/regも識別子として受理(文脈キーワード化)

SVテスト20/20 PASS, JITテスト400/400 PASS
- レキサのキーワードテーブルからSV固有語を削除
- parse_typeでIdentテキスト比較による文脈キーワードとして処理
- is_type_start(), is_global_var_start()も同様にIdentテキスト比較に変更
- expect_ident/current_textのSVキーワード受理コードを削除(不要化)
- baremetal/allowed_pointerの`int* reg = ...`が正常にパース可能に

SVテスト20/20 PASS, JITテスト400/400 PASS
- tests/programs/を削除(tests/に展開済みの旧コピー)
- unified_test_runner.shのPROGRAMS_DIRをtests/に変更
- CI: SVバックエンドテスト用にiverilogインストールステップ追加
- ヘルプメッセージ更新

SVテスト20/20 PASS
- lexer.hppにLexerPlatform enum (Default/SV) 追加
- lexer.cppにadd_sv_keywords()、detect_platform_directive()実装
- --target=sv時: LexerPlatform::SVでposedge/negedge/wire/regをキーワード化
- //! platform: svディレクティブでソースレベルのSVモード指定に対応
- parse_type()のSV固有型Identテキスト比較をswitch-case方式に完全移行
- parser_stmt/decl: is_type_start()/is_global_var_start()にKwPosedge等のcase追加
- parser_type: expect_ident()/current_text()にKwPosedge等の受理を追加

SVテスト20/20 PASS、JITテスト367/373 PASS
baremetal/allowed_pointer (regを変数名として使用) 正常動作確認
- systemverilog_backend.md: Phase 1 → IMPLEMENTED、テストパスをtests/sv/に修正
- systemverilog_codegen_pipeline.md: Phase 1 → IMPLEMENTED、Target enum更新
- method_chaining.md: v1.2更新、パーサー対応済み/型チェッカー未実装を明記
- type_identity_and_name_resolution.md: 未着手→v0.16.0検討のステータス追加
- module_separate_compilation.md: v0.16.0先送りステータス追加

テストベンチ自動生成・プラットフォームディレクティブ実装の反映、
tests/programs/sv/廃止→tests/sv/統合済みの反映
parse_namespace()で型キーワード(KwString等)のnamespace名取得に
current().get_string()を使用していたが、キーワードトークンは
get_string()が空文字列を返すため、namespace名が空になり
関数が"::length"のような不正な名前で登録されていた。

token_kind_to_string(kind)に変更し、式パーサーの型キーワード
名前空間ハンドラ(parser_expr.cpp:1187行)と同じパターンに統一。

JITテスト368/373 PASS (0 FAIL, 5 SKIP)、SVテスト20/20 PASS
- プラットフォームディレクティブ/LexerPlatformモードの追加
- tests/programs統合の反映
- type_keyword_namespaceバグ修正の記載
- CI iverilog追加の反映
- テスト結果更新 (JIT 368/0/5, SV 20/0/0)
- 設計ドキュメント5件更新の記載
- v0.16.0ロードマップ追加
## PRレビュー指摘5件対応
- SV幅付きリテラルのstoi/stoull例外防止(値部空チェック・基数検証・フォールバック)
- current_text()でSVキーワードのテキスト取得をtoken_kind_to_stringに修正
- グローバル変数初期化子省略をSVポート型/属性に限定
- Token/AST/HIR/MIR/codegen全段でBitLiteralInfo optional化
- CI: macOS brew install失敗時にSVテストスキップへ明示的分岐

## ビルド高速化
- ccache自動検出・有効化
- CMake Unity build導入(バッチサイズ16)
- gpu_runtime.mm(ObjC++)をUnity buildから除外

## SV生成物管理
- make cleanに*.sv/*.vcd/*.vvp削除を追加
- SVデフォルト出力先をルート→.tmp/に変更
- VCD $dumpfileパスをSV出力と同ディレクトリに配置
- .gitignoreに*.vvp追加

## コンパイラ警告解消(0 warnings達成)
- buffered_codegen.hpp: int/size_t符号比較をstatic_castで修正
- codegen.cpp: ||内の&&に明示的括弧追加
- mir_to_llvm.cpp: 未使用変数hasAsmOperands削除・isAsmReferencedにmaybe_unused
## 三項演算子最適化
- if/elseが同一変数への単一代入のみの場合、cond ? a : b に自動変換
- ブロッキング代入(=)・ノンブロッキング代入(<=)の両方に対応
- 合成ツールの効率向上と生成コードの可読性改善

## パラメータ化モジュール修正
- sv::param変数がparameter宣言とlogic宣言で二重定義されるバグを修正
- analyzeFunctionでmod.parametersに登録済みの変数をreg宣言から除外

## テストケース追加(20→23件)
- sv/basic/ternary: 三項演算子最適化の検証
- sv/advanced/fsm: 有限状態マシン(FSM)のif-elseチェーン
- sv/advanced/parameterized: sv::paramアトリビュートによるparameter宣言
## 定数リテラルのビット幅自動調整
- BinaryOpで片方が定数の場合、相手オペランドの型からビット幅を推論
- emitConstant/emitOperandにtarget_widthパラメータを追加
- 8bitポートの比較/演算で32'dが付与される問題を部分改善

## else if チェーンの正規化
- 'end else begin + if (...)' → 'end else if (...)' に自動変換
- 余分なendの追跡・除去をbegin/end深度カウントで実装
- priority_encoder/fsm/led_blinker/sv_width_literalで正しく動作確認

## 冗長三項演算子の除去
- 'cond ? X : X' パターンを検出し 'X' に簡略化

## NOT演算子のSV準拠
- MirUnaryOp::Not を '!' → '~' に変更(SVスタイル推奨)

## parameter宣言の簡潔化
- 'parameter logic signed [31:0] WIDTH' → 'parameter WIDTH' に変更
- 合成ツール互換性の向上
- emitRvalueにtarget_widthパラメータ追加
- emitStatementで代入先(place.type/locals)の型からビット幅を推論
- 32bit(intデフォルト)以外の場合、emitRvalue→emitOperand→emitConstantに伝播
- place.typeを優先使用し、なければfunc.localsからフォールバック
- always_ff, always_comb, always_latch をCm言語のキーワードとして追加
- always (無印) は自動判別: if/else解析でcomb/latchを自動選択
- #[sv::latch] 属性を削除、always_kind enumベースに移行
- 関数属性の伝搬チェーン構築 (AST→HIR→MIR→Codegen)
- エッジ信号の重複排除修正
- テスト23件追加 (26→49テスト)
  - always系: async_reset, auto_latch, comb_explicit, ff_explicit, latch_explicit, mixed, multi_always_comb
  - 後方互換: backward_compat_async/posedge/comb
  - const/param: const_expr, sv_param, localparam_const
  - 型: signed_types, unsigned_types, bool_logic, internal_reg
  - 演算子: all_operators, all_comparisons, nested_ternary
  - 制御構文: deep_if_else, compound_conditions
  - 複合回路: clock_domain, uart_counter
- switch → case/endcase テスト追加 (control/switch_case.cm)
- 多段FSM状態遷移テスト追加 (control/switch_fsm.cm)
- for ループテスト追加 (control/for_loop.cm)
- increment ++ 展開テスト追加 (basic/increment.cm)
- パーサー未対応テスト削除 (assign_wire, bit_width, inout_port, wire_reg)
- bit[N]カスタムビット幅型: TypeKind::Bit追加、bit[4]→logic[3:0]変換
  - AST/パーサー(parse_type, is_type_start, is_global_var_start)
  - Codegen(mapType, getBitWidth): Array(Bit,N)→logic[N-1:0]
- assign文: トップレベルassign type name = expr; パース
  - AST/HIR/MIR is_assignフラグ伝搬チェーン
  - Codegen: wire宣言 + assign name = expr; 出力
- inout初期化子なし変数: is_global_var_start()で;終端もサポート
- 配列サフィックス[N]のルックアヘッドスキップ追加
…ion automatic (59テスト全PASS)

- enum → typedef enum logic [W-1:0]: ビット幅自動計算、メンバー値出力
- struct → typedef struct packed: 全フィールドをlogic型で宣言
- function → function automatic / task automatic:
  - posedge/negedge以外の引数を持つ関数のみSV function/taskに変換
  - 引数なし/void関数は従来通りalways_combで出力
- SVModule に type_declarations + function_blocks 追加
- emitModule に対応する出力処理追加
パーサー: {構造体リテラル}, {連接}, {N{複製}} の3パターン判別を追加
型チェッカー: __builtin_concat/__builtin_replicate のバイパスを追加
HIR lowering: ビルトイン関数リストに連接/複製を登録
SV Codegen: Call Terminator でRef+Const逆引きマップを構築し
  連接→{a, b, ...}、複製→{N{expr}} のSV構文を直接出力
  SV002ポインタ型テンポラリスキップを追加
  function body内のテンポラリ変数宣言を修正
テスト: concat_replicate テスト+expect追加

全60テストPASS、回帰なし
Copilot AI review requested due to automatic review settings March 10, 2026 15:06
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Cm v0.15.1 に向けて、SystemVerilog(SV)バックエンド向けのフロントエンド拡張(SV固有型/always/assign/幅付きリテラル/concat・replicate構文)と、それに伴うMIR/HIR伝搬・CI/ビルド設定更新を行うPRです。合わせて、旧 tests/programs/** 配下の多数のテスト資産が削除され、tests/common/** 側へ整理されているように見えます。

Changes:

  • SV向け構文・型・属性のパース/AST→HIR→MIR伝搬を追加(幅付き整数リテラル、SV固有型、always/assign、属性の名前空間対応)
  • 新規SVコード生成バックエンド骨組みを追加し、ターゲット/Make/CIにSVを追加
  • 期待値の更新(例: bitwise NOTの期待値修正)と、旧テストプログラム群の削除

Reviewed changes

Copilot reviewed 290 out of 1132 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
src/frontend/lexer/token.hpp SV固有キーワードと幅付きリテラル情報(BitLiteralInfo)をトークンに追加
src/frontend/parser/parser_expr.cpp {a,b} 連接 / {N{expr}} 複製 / {field:...} 構造体リテラルの判別とbuiltin化を追加
src/frontend/parser/parser_type.cpp SV固有型キーワード(posedge/negedge/wire/reg/bit)を型として解釈
src/frontend/parser/parser_module.cpp 属性の名前空間対応、SVポート宣言向けにグローバル変数初期化子省略を導入
src/frontend/types/checking/call.cpp __builtin_concat/__builtin_replicate の型推論バイパスを追加
src/frontend/ast/types.hpp SV固有TypeKindと型生成ヘルパーを追加
src/hir/nodes.hpp リテラルのbit_info、関数always情報、GVのassign/attributesを追加
src/mir/nodes.hpp 定数bit_info、関数always情報、GVのassign/attributesを追加
src/hir/lowering/decl.cpp AST→HIRでalways_kind/attributes/is_assign を伝搬
src/hir/lowering/expr.cpp AST→HIRでliteral bit_infoを伝搬、builtin関数集合を拡張
src/mir/lowering/impl.cpp HIR→MIRでalways_kind/attributes を伝搬
src/mir/lowering/expr_basic.cpp HIR→MIRで定数bit_infoを伝搬
src/mir/lowering/base.cpp const GVもSV出力のため global_vars に登録する動作へ変更
src/common/target.hpp TargetにSVを追加
src/codegen/sv/codegen.hpp SVバックエンドのコード生成クラス/構造体を新規追加
CMakeLists.txt ccache自動検出、Unity build有効化、SVバックエンドソース追加
Makefile SVターゲットのビルド/テストショートカットを追加、生成物(.sv等)をclean対象へ
.github/workflows/ci.yml ubuntu-latest/macos-15 への更新、SVテストジョブとiverilog導入を追加
tests/common/basic/bitwise_ops.expect ~0 と flags clear の期待値を修正
docs/v0.15.1/sv_cm_mapping.md Cm⇔SVマッピング表を追加(ただし一部現状と齟齬あり)
VERSION 0.15.1へ更新
tests/programs/** (多数) 旧テストプログラム/expect/skip 等を大量に削除(整理)
Comments suppressed due to low confidence (2)

src/frontend/ast/types.hpp:72

  • TypeKind::Bit を追加していますが、get_primitive_info() に Bit の分岐がありません。このままだとBit型のサイズ/アラインメントがデフォルト扱いになり、SV型マッピングやコード生成でビット幅計算が破綻する可能性があります。最低限 case TypeKind::Bit: return {1,1}; のように明示し、必要なら bit[N] のNを表現できるようType表現(幅フィールド等)も合わせて拡張してください。
inline TypeInfo get_primitive_info(TypeKind kind) {

src/frontend/ast/types.hpp:360

  • TypeKind::Bit の文字列表現が type_to_string() に存在しません。デバッグ表示・エラーメッセージ・テスト期待値生成等でBit型が空/不正表現になる恐れがあるため、case TypeKind::Bit: return \"bit\";(幅があるなら bit [N-1:0] 等)を追加してください。
inline std::string type_to_string(const Type& t) {

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +474 to +480
// SV固有キーワードも識別子として受理(SVモードでキーワードトークンの場合)
if (check(TokenKind::KwPosedge) || check(TokenKind::KwNegedge) || check(TokenKind::KwWire) ||
check(TokenKind::KwReg)) {
std::string name(current().get_string());
advance();
return name;
}
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

expect_ident() がSVキーワードトークン(KwPosedge等)を識別子として受理する分岐で current().get_string() を使っていますが、同ファイル内の current_text() では『キーワードトークンはget_string()が空文字を返す』と明記されています。ここも token_kind_to_string(current().kind) を使う(または current_text() を呼ぶ)形に揃えないと、posedge 等が空文字として解釈され、名前解決やエラーメッセージ生成が壊れます。

Copilot uses AI. Check for mistakes.
Comment on lines +1020 to +1029
if (check(TokenKind::LBrace)) {
// 先読みで構造体リテラルかどうかを判別
auto saved_pos = pos_;
advance(); // { を消費

// 空の {} はスキップ(ブロックとして扱う)
if (check(TokenKind::RBrace)) {
pos_ = saved_pos;
// 通常のブロック式として処理をフォールスルー
}
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

空の {} を『ブロックとして扱う』目的で pos_ を巻き戻していますが、このまま同じ {...} 判別ロジックの後続(concat/struct判別)に進むため、結果的に {} を concat として解釈しようとして parse_expr() に入り、再び {} 判別へ戻る再帰(無限再帰/スタックオーバーフロー)になり得ます。{} を検出した時点で、この分岐を抜けてブロック式の既存パースへ委譲する(例: その場でブロック式パース関数を呼んでreturn、もしくはラベル/フラグでこの新ロジックをスキップ)ように制御フローを切ってください。

Copilot uses AI. Check for mistakes.
// 初期化子省略をSVポート型/アトリビュートに限定
// posedge/negedge型、または#[input]/#[output]属性付きはport宣言のため初期化子不要
bool is_sv_port = false;
if (type && (type->name == "posedge" || type->name == "negedge")) {
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SVポート判定が type->name 文字列比較になっていますが、今回 ast::make_posedge() / make_negedge()TypeKind::Posedge/Negedge を返す実装で、name が必ずしも設定されない可能性があります(=判定に失敗して = 必須エラーになる)。type->kind(Posedge/Negedge)で判定するか、Type生成時に name を必ず入れるなど、表現に依存しない判定へ変更してください。

Suggested change
if (type && (type->name == "posedge" || type->name == "negedge")) {
if (type && (type->kind == ast::TypeKind::Posedge ||
type->kind == ast::TypeKind::Negedge)) {

Copilot uses AI. Check for mistakes.
Comment on lines 99 to 110
case TypeKind::String:
case TypeKind::CString:
return {8, 8}; // ポインタサイズ
case TypeKind::Posedge:
case TypeKind::Negedge:
return {1, 1}; // 信号型(1bit)
case TypeKind::Wire:
case TypeKind::Reg:
return {0, 1}; // 修飾子型(サイズは要素型依存)
default:
return {0, 1};
}
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TypeKind::Bit を追加していますが、get_primitive_info() に Bit の分岐がありません。このままだとBit型のサイズ/アラインメントがデフォルト扱いになり、SV型マッピングやコード生成でビット幅計算が破綻する可能性があります。最低限 case TypeKind::Bit: return {1,1}; のように明示し、必要なら bit[N] のNを表現できるようType表現(幅フィールド等)も合わせて拡張してください。

Copilot uses AI. Check for mistakes.
case TypeKind::Wire:
return "wire " + (t.element_type ? type_to_string(*t.element_type) : "?");
case TypeKind::Reg:
return "reg " + (t.element_type ? type_to_string(*t.element_type) : "?");
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TypeKind::Bit の文字列表現が type_to_string() に存在しません。デバッグ表示・エラーメッセージ・テスト期待値生成等でBit型が空/不正表現になる恐れがあるため、case TypeKind::Bit: return \"bit\";(幅があるなら bit [N-1:0] 等)を追加してください。

Suggested change
return "reg " + (t.element_type ? type_to_string(*t.element_type) : "?");
return "reg " + (t.element_type ? type_to_string(*t.element_type) : "?");
case TypeKind::Bit:
return "bit";

Copilot uses AI. Check for mistakes.
| `generate ... endgenerate` | パラメトリック生成 | 未サポート |
| `always @(*)` | 旧来の組み合わせ | `always_comb` を使用 |
| `always @(posedge ... or negedge ...)` | 非同期リセット | 未サポート |
| `assign wire = expr;` | 連続代入 | 未サポート |
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本文では assign / {a,b} / {N{expr}} を『未サポート』としていますが、このPRでは HirGlobalVar::is_assign の追加、__builtin_concat / __builtin_replicate のパースと型推論バイパス追加が入っており、少なくとも“フロントエンドが受け付ける/内部表現がある”段階には進んでいます。実際のSVコード生成が未対応なら『パース/IRまでは対応、SV出力は未対応』等に表現を更新し、対応済みなら表を更新してください。

Suggested change
| `assign wire = expr;` | 連続代入 | 未サポート |
| `assign wire = expr;` | 連続代入 | パース/IR までは対応、SV出力は未対応 |

Copilot uses AI. Check for mistakes.
Comment on lines +71 to +72
| `{a, b}` | 連接 (concatenation) | 未サポート |
| `{N{expr}}` | 複製 (replication) | 未サポート |
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本文では assign / {a,b} / {N{expr}} を『未サポート』としていますが、このPRでは HirGlobalVar::is_assign の追加、__builtin_concat / __builtin_replicate のパースと型推論バイパス追加が入っており、少なくとも“フロントエンドが受け付ける/内部表現がある”段階には進んでいます。実際のSVコード生成が未対応なら『パース/IRまでは対応、SV出力は未対応』等に表現を更新し、対応済みなら表を更新してください。

Suggested change
| `{a, b}` | 連接 (concatenation) | 未サポート |
| `{N{expr}}` | 複製 (replication) | 未サポート |
| `{a, b}` | 連接 (concatenation) | パース/IRまでは対応、SV出力は未対応 |
| `{N{expr}}` | 複製 (replication) | パース/IRまでは対応、SV出力は未対応 |

Copilot uses AI. Check for mistakes.
Comment on lines +160 to +162
// always_kind を伝搬(HIR→MIR: enum値をintでキャスト)
mir_func->always_kind = static_cast<MirFunction::AlwaysKind>(
static_cast<int>(func.always_kind));
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AST/HIR/MIR間の AlwaysKindint 経由でキャストしており、列挙子の順序変更・追加で静かに不整合が発生します。明示的な変換関数(switchで各列挙子を対応付け)か、少なくとも static_assert で列挙子数や値が一致することを保証して、将来の変更で壊れないようにしてください。

Suggested change
// always_kind を伝搬(HIR→MIR: enum値をintでキャスト)
mir_func->always_kind = static_cast<MirFunction::AlwaysKind>(
static_cast<int>(func.always_kind));
// always_kind を伝搬(HIR→MIR: enum間を直接キャスト)
mir_func->always_kind = static_cast<MirFunction::AlwaysKind>(func.always_kind);

Copilot uses AI. Check for mistakes.
Comment on lines +26 to +27
set(CMAKE_UNITY_BUILD ON)
set(CMAKE_UNITY_BUILD_BATCH_SIZE 16)
Copy link

Copilot AI Mar 10, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unity build をデフォルトで強制ONにすると、プラットフォームやコンパイラ差・ODR/匿名名前空間/マクロ衝突などでビルドが不安定化しやすく、外部開発者の環境でも挙動差が出ることがあります。option(CM_UNITY_BUILD ...) のようにプロジェクトオプション化してデフォルトOFF(またはCIのみON)にする、もしくはUnity除外リストを整備して安全に段階導入するのがおすすめです。

Suggested change
set(CMAKE_UNITY_BUILD ON)
set(CMAKE_UNITY_BUILD_BATCH_SIZE 16)
option(CM_UNITY_BUILD "Enable unity build (experimental; default OFF)" OFF)
if(CM_UNITY_BUILD)
set(CMAKE_UNITY_BUILD ON)
set(CMAKE_UNITY_BUILD_BATCH_SIZE 16)
endif()

Copilot uses AI. Check for mistakes.
@shadowlink0122
Copy link
Owner Author

ブランチミス

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants